package servico;

import dao.EstadiaDAO;
import dao.MedicoQuartoDAO;
import dao.QuartoDAO;
import dao.fabrica.FabricaDeDAOs;
import excecao.AplicacaoException;
import excecao.ObjetoDuplicadoException;
import excecao.ObjetoNaoEncontradoException;
import java.util.List;
import modelo.*;

public class QuartoAppService {

    private static QuartoDAO quartoDAO = FabricaDeDAOs.getDAO(QuartoDAO.class);
    private static EstadiaDAO estadiaDAO = FabricaDeDAOs.getDAO(EstadiaDAO.class);
    private static MedicoQuartoDAO medicoQuartoDAO = FabricaDeDAOs.getDAO(MedicoQuartoDAO.class);
    
    private static DataAtual d = new DataAtual();
    String dataAtual = d.getData();

    public void inclui(Quarto umQuarto) throws AplicacaoException {
        try {
            quartoDAO.inclui(umQuarto);

        } catch (ObjetoDuplicadoException e) {
            throw new AplicacaoException("Usuário já cadastrado");
        }

    }

    public void altera(Quarto umQuarto)
            throws AplicacaoException {
        try {

            quartoDAO.altera(umQuarto);

        } catch (ObjetoNaoEncontradoException e) {

            throw new AplicacaoException("Usuario não encontrado");
        }
    }

    public void exclui(Quarto umQuarto)
            throws AplicacaoException {
        try {

            quartoDAO.exclui(umQuarto);

        } catch (ObjetoNaoEncontradoException e) {

            throw new AplicacaoException("Usuario não encontrado");
        }
    }

    public Quarto recuperaUmQuarto(Quarto umQuarto)
            throws AplicacaoException {
        try {

            Quarto quarto = quartoDAO.recuperaUmQuarto(umQuarto);

            return quarto;
        } catch (ObjetoNaoEncontradoException e) {

            throw new AplicacaoException("Usuario não encontrado");
        }
    }

    public List<Quarto> recuperaQuartos() {
        List<Quarto> quartos;
        quartos = quartoDAO.recuperaQuartos();
        
        return quartos;
    }

    public void removeOuVinculaResidenteAQuarto(Quarto quarto, Residente residente) throws ObjetoNaoEncontradoException, ObjetoDuplicadoException, Exception {
        Estadia estadia;
        Quarto quartoAux;
        if ((quarto.getNumero() == null) || quarto.getNumero().equals(0)) {
            estadia = estadiaDAO.recuperaEstadiaCorrentePorResidente(residente);
            if (!(estadia == null)) {

                estadia.setDataEncerramento(dataAtual);
                estadiaDAO.altera(estadia);
            }
        } else {
            quartoAux = quartoDAO.recuperaUmQuarto(quarto);
            if (quartoAux == null) {
                ObjetoNaoEncontradoException exception = new ObjetoNaoEncontradoException();
                throw exception;
            }
            if (!(estadiaDAO.recuperaEstadiaPorQuarto(quarto) == null)) {
                Exception exception = new Exception("Este quarto já está vinculado a outra estadia");
                throw exception;
            }

            estadia = estadiaDAO.recuperaEstadiaCorrentePorResidente(residente);
            if (estadia == null) {
                estadia = new Estadia();
                estadia.setResidente(residente);
                estadia.setQuarto(quartoAux);
                estadia.setDataEntrada(dataAtual);
                estadiaDAO.inclui(estadia);
            } else {
                
                estadia.setDataEncerramento(dataAtual);
                estadiaDAO.altera(estadia);
                
                
                estadia = new Estadia();
                estadia.setResidente(residente);
                estadia.setQuarto(quartoAux);
                estadia.setDataEntrada(dataAtual);
                estadiaDAO.inclui(estadia);
            }
        }
    }

    public void removeOuVinculaMedicoAQuarto(Quarto quarto, Medico medico) throws ObjetoNaoEncontradoException, ObjetoDuplicadoException, Exception {
        MedicoQuarto medicoQuarto;
        Quarto quartoAux;
        if ((quarto.getNumero() == null) || quarto.getNumero().equals(0)) {
            medicoQuarto = medicoQuartoDAO.recuperaMedicoQuartoCorrentePorMedico(medico);
            if (!(medicoQuarto == null)) {

                medicoQuarto.setDataEncerramento(dataAtual);
                medicoQuartoDAO.altera(medicoQuarto);
            }
        } else {
            quartoAux = quartoDAO.recuperaUmQuarto(quarto);
            if (quartoAux == null) {
                ObjetoNaoEncontradoException exception = new ObjetoNaoEncontradoException();
                throw exception;
            }
            if (!(medicoQuartoDAO.recuperaMedicoQuartoPorQuarto(quarto) == null)) {
                Exception exception = new Exception("Este quarto já está vinculado a outra medicoQuarto");
                throw exception;
            }

            medicoQuarto = medicoQuartoDAO.recuperaMedicoQuartoCorrentePorMedico(medico);
            if (medicoQuarto == null) {
                medicoQuarto = new MedicoQuarto();
                medicoQuarto.setMedico(medico);
                medicoQuarto.setQuarto(quartoAux);
                medicoQuarto.setDataEntrada(dataAtual);
                medicoQuartoDAO.inclui(medicoQuarto);
            } else {
                
                medicoQuarto.setDataEncerramento(dataAtual);
                medicoQuartoDAO.altera(medicoQuarto);
                
                
                medicoQuarto = new MedicoQuarto();
                medicoQuarto.setMedico(medico);
                medicoQuarto.setQuarto(quartoAux);
                medicoQuarto.setDataEntrada(dataAtual);
                medicoQuartoDAO.inclui(medicoQuarto);
            }
        }
    }
}
